/* 引入token的处理状态 */
import { getToken, setToken, removeToken,setTimeStamp } from '@/utils/auth'
/* 引入接口 */
import { login, getUserInfo,getUserDetailById } from '@/api/user'
const state = {
  token: getToken(),//这个就是用户每次登录的时候都要使用的数据 来验证用户是否登录
  userInfo: {}//定义一个空的对象 不是null 因为后面我要开发userInfo的属性给别人用
  // userInfo.name 如果时空的话 getters中引用userInfo就会出现报错
};
/* 状态管理 */
const mutations = {
  //设置token
  setToken(state, token) {
    state.token = token,//请问这个数据从哪里来的 就是action来的
      // vuex缓存数据 你知道什么意思吗
      setToken(token)//vuex和缓存数据同步
  },
    removeToken(state) {
    // 为什么传递一个数据 删除就只要一个数据就好了
    // removeToken(state)
    state.token = null
    removeToken()//调用这个方法删除token
  },
  setUserInfo(state, userInfo) {
    state.userInfo = { ...userInfo } //用浅拷贝的方式去赋值对象 因为这样数据更新就会触发新的更新
  },
  /* 删除用户资料 */
  removeUserInfo(state){
    state.userInfo={}
  }


};
/* 异步提交数据的函数 */
const actions = {
  /* 封装登录的token */
  async login(context, data) {
    const result = await login(data)
    // 判断是否成功

    context.commit('setToken', result)
    // 登录成功写入时间戳 其实第一步 就是写入时间戳 第二部才是获得时间戳
    setTimeStamp()
  },
  /* 获取用户的资料 */
  async getUserInfo(context) {
    const result = await getUserInfo()//获取返回值
    // 获取用户的的头像
    const baseInfo=await getUserDetailById(result.userId)//获取用户的id
    const baseResult={...result,...baseInfo}//将两个接口合并为一个数据
    context.commit('setUserInfo', baseResult)
    return result//这里为什么要回return 返回值 为后面埋下伏笔
  },
  /* 用户登出操作 */
  logout(context){
    context.commit('removeToken')//不仅仅删除了vuex中的 还删除了缓存中的
    // 删除用户资料
    context.commit('removeUserInfo')
  }
};
/* 导出模块 */
export default {
  namespaced: true,
  state,
  mutations,
  actions,
};
